#include <iostream>

// 用sizeof()函数获取数据类型大小
void sizeof_data()
{
    std::cout << "Size of int: " << sizeof(int) << std::endl;
    std::cout << "Size of float: " << sizeof(float) << std::endl;
    std::cout << "Size of char: " << sizeof(char) << std::endl;
    std::cout << "Size of bool: " << sizeof(bool) << std::endl;
}

// 数据类型描述
void discription_of_data_types()
{
    int a = 10;
    float b = 20.5;
    double c = 30.7;
    // 字符型存储的不是字符本身，而是其ASCII码
    char d = 'A';
    bool e = true;

    // 此外还有 long 、short 等修饰数据类型。字节大小不一样
    long long f = 40;
    short g = 50;

    // 这里用数组来实现字符串
    char zifu[10] = {};
    // 字符串用string类来表示,需要头文件#include <iostream>
    std::string str = "字符串";
}

/*
    再有就是 数据类型存在类型转换的问题

    个人理解：数据类型的转换就是：
        首先数据在机器中存储为二进制的形式，而运算的过程中涉及内存大小不同，
        这就涉及到了对不同数据类型的二进制表示，进行截断或扩展的操作。
        还有一点就是，int 占4字节，处理比较方便。（这个不确定不同机器字长会不会影响）

    存在两种类型转换方式：
    1. 隐式转换：自动转换数据类型，编译器自动进行
        a.整数提升： char -> short -> int -> long -> long long
        b.算术转换： int + double  ==> double
        c.赋值转换:  int = double  ==> int
    2. 显示转换：需要程序员手动转换数据类型。
        a.当需要将一种类型转换为另一种类型，而编译器无法自动完成隐式转换时。
        b.当需要确保特定的类型转换行为，避免编译器的默认行为时。
        c.当需要进行低级的内存操作或特殊的类型处理时。
        d.显示数据类型转换的4种方式：  可以看大佬教程：https://blog.csdn.net/weixin_45031801/article/details/142147962
            (1) static_cast<type>(expression)，静态转换
            (2) const_cast<type>(expression)，动态转换
            (3) reinterpret_cast<type>(expression)，
            (4) dynamic_cast<type>(expression)
*/

// static_cast<type>(expression)
void type1()
{
    double d = 10.5;
    int i = static_cast<int>(d); // 10
}

// dynamic_cast<type>(expression)
void type2()
{
    class Base
    {
        virtual void func() {}
    };
    class Derived : public Base
    {
        //
    };

    Base *basePtr = new Derived;
    Derived *derivedPtr = dynamic_cast<Derived *>(basePtr); // 动态转换
}

// const_cast<type>(expression)
void type3()
{

    const int a = 10;

    // 指针指向常量，可以修改常量的值
    int *b = const_cast<int *>(&a);
}

// reinterpret_cast<type>(expression)
void type4()
{
    int a = 10;
    // 不安全的类型转换
    double *b = reinterpret_cast<double *>(&a);
}

// 一些运算符相关
void op_knowledge()
{
    /*这部分没啥吧，就几种运算符
    还有涉及到运算符重载后面再说吧。
    ！：运算符文档我也放ob里了，欸嘿
    */
}